/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tools;

/**
 *
 * eCOM - Adopte un Presta - Mars-Avril 2013
 * @author William
 */

import java.util.List;
import java.util.ArrayList;

// Un "découpeur" de Strings. Derrière ce nom peu glamour
// se cache un outil permettant de découper une commande en
// tableau de Strings.
public class StringDecoupeur {
    	private StringDecoupeur() 
        {
            // Constructeur vide.
	}
        
        /**
	* Analyse la ligne de commande et la découpe en un tableau de String.
	* Les arguments qui contiennent des espaces doivent être écrits entre guillemet
	* Les guillemet doivent être échapés en utilisant le char '\'
	* Les caractère '\' doivent être échapés en utilisant '\\'
	* 
	* @param commandLine La ligne de commande à découper
        * @return une liste d'argument résultant de la ligne de commande.
        */
        public static List<String> decoupeCmdLine(String commandLine) 
        {
            List<String> resultBuffer = new ArrayList<String>();

            if (commandLine != null) 
            {
                int z = commandLine.length();
                boolean insideQuotes = false;
                StringBuffer buf = new StringBuffer();

                for (int i = 0; i < z; ++i) 
                {
                    char c = commandLine.charAt(i);
                    if (c == '"') 
                    {
                        appendToBuffer(resultBuffer, buf);
                        insideQuotes = !insideQuotes;
                    } 
                    else if (c == '\\') 
                    {
                        if ((z > i + 1)
                            && ((commandLine.charAt(i + 1) == '"')
                                || (commandLine.charAt(i + 1) == '\\'))) 
                        {
                        buf.append(commandLine.charAt(i + 1));
                        ++i;
                        } 
                        else 
                        {
                            buf.append("\\");
                        }
                    } 
                    else 
                    {
                        if (insideQuotes) 
                        {
                            buf.append(c);
                        } 
                        else 
                        {
                            if (Character.isWhitespace(c)) 
                            {
                                appendToBuffer(resultBuffer, buf);
                            } 
                            else 
                            {
                                buf.append(c);
                            }
                        }
                    }
                }
                appendToBuffer(resultBuffer, buf);

            }
            return resultBuffer;
        }

        
        private static void appendToBuffer(List<String> resultBuffer,
            StringBuffer buf) 
        {
            if (buf.length() > 0) 
            {
                resultBuffer.add(buf.toString());
                buf.setLength(0);
            }
        }
        
        
}
